package com.beidu.lottery.call.service.portal;


import com.beidu.lottery.call.entity.PortalActivityRule;
import com.beidu.lottery.call.entity.dto.LotteryLeaveNumDTO;

/**
 * <p>
 * 用户数据 服务类
 * </p>
 *
 * @author 北渡
 * @since 2023-08-23
 */
public interface UserDataService {

    /**
     * 查询用户积分
     *
     * @author 北渡
     */
    Long queryUserPoints();

    /**
     * 查询报名活动的剩余报名名额
     *
     * @param rule 活动规则
     * @author 北渡
     */
    Integer queryRegRemainingQuota(PortalActivityRule rule);

    /**
     * 查询报名活动的剩余报名名额-字符串
     *
     * @param id 活动ID
     * @return 字符串格式：n/max
     * @author 北渡
     */
    String queryRegRemainingQuotaString(Integer id);

    /**
     * 查询用户剩余投票次数
     * <p>
     * 根据投票限额方式自动适配返回值（当日或总数）
     *
     * @param rule 活动规则
     * @author 北渡
     */
    Integer queryVoteRemainingTimes(PortalActivityRule rule);

    /**
     * 查询用户剩余投票次数（前端使用）
     * <p>
     * 根据投票限额方式自动适配返回值（当日或总数）
     *
     * @param id 活动ID
     * @author 北渡
     */
    Integer queryVoteRemainingTimes(Integer id);

    /**
     * 积分操作预提交（Producer）
     * <p>
     * 发放、减扣等操作
     *
     * @param points     积分（正数代表增加，负数代表减少）
     * @param activityId 活动ID
     * @author 北渡
     */
    void pointsOpPreSubmit(Integer points, Integer activityId);

    /**
     * 积分操作保存（Consumer）
     * <p>
     * 发放、减扣等操作
     *
     * @param points     积分（正数代表增加，负数代表减少）
     * @param activityId 活动ID
     * @author 北渡
     */
    void pointsOpSubmit(Integer points, Integer activityId);

    /**
     * 查询用户剩余抽奖次数（前端使用）
     * <p>
     * 根据抽奖限额方式自动适配返回值（当日或总数）
     *
     * @param id 活动ID
     * @author 北渡
     */
    Integer queryLotteryRemainingTimes(LotteryLeaveNumDTO request);

    /**
     * 查询用户剩余抽奖次数
     * <p>
     * 根据抽奖限额方式自动适配返回值（当日或总数）
     *
     * @param rule 活动规则
     * @author 北渡
     */
    Integer queryLotteryRemainingTimes(PortalActivityRule rule);

    /**
     * 查询抽奖活动的剩余中奖名额
     *
     * @param rule 活动规则
     * @author 北渡
     */
    Integer queryLotteryRemainingQuota(PortalActivityRule rule);


    /**
     * 查询用户剩余抽奖次数（前端使用）
     * <p>
     * 根据抽奖限额方式自动适配返回值（当日或总数）
     */
    Integer queryLotteryLeaveNum(LotteryLeaveNumDTO req);

    /**
     * 布隆过滤器查询用户剩余抽奖次数（前端使用）
     * <p>
     * 先判断布隆过滤器中是否存在该用户id不存在则直接返回0次
     */
    Integer queryLotteryLeaveNumBloomFilter(LotteryLeaveNumDTO req);

    /**
     * 增加用户抽奖次数
     * <p>
     */
    void addLotteryTimes(LotteryLeaveNumDTO req);

    /**
     * 添加活动id到布隆过滤器中
     * <p>
     */
    void addActivityId(LotteryLeaveNumDTO req);
}
